<?php

/**
 * 用户相关处理，增加、修该、删除
 *
 * @author jiang
 */

namespace Kj\Admin\Controller;

use View, Scstore, Input, Redirect, Config, Auth, Lang, Response, Request, Hash, URL, Validator;
use Kj\Admin\Controller\AdminController;
use Kj\Admin\Libraries\Acl;
use Kj\Admin\Libraries\Tree;
use Kj\Admin\Models\User;
use Kj\Admin\Models\Group;
use Kj\Admin\Libraries\Js;
use Kj\Admin\Validator\User as UserValidator;

class UserController extends AdminController
{
    /**
     * 用户表模型
     *
     * @var object
     */
    protected $userModel;
    
    /**
     * 用户组表模型
     *
     * @var object
     */
    protected $groupModel;
    
    /**
     * 权限处理对象
     *
     * @var object
     */
    protected $acl;

    /**
     * 初始化，实例化用户（组）模型，权限处理
     *
     * @access public
     */
    public function __construct()
    {
        parent::__construct();
        $this->userModel = new User();
        $this->groupModel = new Group();
        $this->acl = new Acl();
    }

    /**
     * 用户管理列表
     *
     * @access public
     */
    public function index()
    {
        $groupId = Input::get('gid', null);
        $list = $this->userModel->getAllUser($groupId);
        $page = $this->userModel->page();
        $groupList = $this->groupModel->getAllGroup();
        return View::make('admin/user/index')->with(
            compact('list', 'groupList', 'page')
        );
    }
    
    /**
     * 增加一个用户
     *
     * @access public
     */
    public function add()
    {
        if(Request::method() == 'POST') return $this->_saveUserInfoToDatabase();
        
        //增加用户的时候不能增加比自己等级高的用户
        $groupId = Auth::user()->group_id;
        $groupInfo = $this->groupModel->getOneGroupById($groupId);
        $groupList = $this->groupModel->getGroupLevelLessThenCurrentUser($groupInfo['level']);
        
        //表单URL
        $formUrl = URL::to('admin/user/add');
        
        return View::make('admin/user/add')->with(compact('groupList', 'formUrl'));
    }
    
    /**
     * 保存数据到数据库
     *
     * @access private
     */
    private function _saveUserInfoToDatabase()
    {
        $data = (array) Input::get('data', false);
        
        //表单验证
        $validator = new UserValidator();
        if( ! $validator->add($data))
        {
            return Js::error($validator->getMsg());
        }

        //检查当前用户的权限是否能增加这个用户
        if( ! $this->acl->checkGroupLevelPermission($data['group_id'], false))
            return Js::error(Lang::get('bk.account_level_deny'));
        
        $data['add_time'] = time();
        
        //检测当前用户名是否已经存在
        $info = $this->userModel->getOneUserByName($data['name']);
        if($info) return Js::error(Lang::get('bk.account_exists'));

        //开始保存到数据库
        if($this->userModel->addUser($data) !== false)
        {
            return Js::locate(URL::to('admin/user/index'), 'parent');
        }

        //保存出错
        return Js::error(Lang::get('bk.action_success'));
    }
    
    /**
     * 删除用户
     *
     * @access public
     */
    public function delete()
    {
        //用户ID必须要传入
        if( ! $id = Input::get('id', false)) return responseJson(Lang::get('bk.action_error'));

        //确保用户ID为数组
        if( ! is_array($id)) $id = array($id);
        
        foreach($id as $value)
        {
            //判断当前用户有没有权限进行这个操作
            if( ! $this->acl->checkGroupLevelPermission($value))
                return responseJson(Lang::get('bk.account_level_deny'));
            
            //不能删除系统的创始人帐号
            if($value == Config::get('admin.admin_id'))
                return responseJson(Lang::get('bk.sys_account'));
        }
        
        //开始删除
        if($this->userModel->deleteUser($id) !== false)
            return responseJson(Lang::get('bk.action_success'), true);
        
        //删除出错
        return responseJson(Lang::get('bk.action_error'));
    }
    
    /**
     * 编辑用户的资料
     *
     * @access public
     */
    public function edit()
    {
        if(Request::method() == 'POST') return $this->_updateUserInfoToDatabase();

        //确保用户的ID正确的传入
        $id = Input::get('id', false);
        
        //确保参数正确
        if( ! $id or ! is_numeric($id)) return Js::error(Lang::get('bk.illegal_operation'));
        
        //所要编辑的用户的信息
        $userInfo = $this->userModel->getOneUserById($id);
        
        //找不到用户
        if(empty($userInfo)) return Js::error(Lang::get('bk.user_not_found'), true);

        //检测当前用户有没有权限进行编辑
        if( ! $this->acl->checkGroupLevelPermission($id))
            return Js::error(Lang::get('bk.account_level_deny'), true);
        
        //根据当前用户的权限获取用户组列表
        $groupInfo = $this->groupModel->getOneGroupById(Auth::user()->group_id);
        $groupList = $this->groupModel->getGroupLevelLessThenCurrentUser($groupInfo['level']);
        
        //表单URL
        $formUrl = URL::to('admin/user/edit');
        
        $view = View::make('admin/user/add')->with('groupList', $groupList)
            ->with(compact('userInfo', 'formUrl', 'id'));
        return $view;
    }
    
    /**
     * 更新用户信息到数据库
     *
     * @access private
     */
    private function _updateUserInfoToDatabase()
    {
        //确保一些参数已经正确传入
        $data = Input::get('data', false);
        $id = intval($data['id']);
        if( ! $data or ! is_array($data)) return Js::error(Lang::get('bk.info_incomplete'));

        //表单验证
        $validator = new UserValidator();
        if( ! $validator->edit($data))
        {
            return Js::error($validator->getMsg());
        }

        //如何输入了密码，那么生成新的密码
        if( ! empty($data['password']))
        {
            $data['password'] = Hash::make($data['password']);
        }
        else
        {
            unset($data['password']);
        }
        
        //删除不需要更新的信息
        unset($data['password_confirmation'], $data['sex'], $data['id']);
        
        //检测当前用户的权限是否能进行操作
        if( ! $this->acl->checkGroupLevelPermission($id))
        {
            return Js::error(Lang::get('bk.account_level_deny'));
        }
        
        //开始入库
        if($this->userModel->editUser($data, $id) !== false)
        {
            return Js::locate(URL::to('admin/user/index'), 'parent');
        }
        return Js::error(Lang::get('bk.action_error'));
    }
    
    /**
     * 修该用户密码
     *
     * @access public
     */
    public function password()
    {
        $username = Auth::user()->name;
        if(Request::method() == 'POST')
        {
            //保证传入的参数正确性
            $data = Input::get('data', false);
            if( ! $data or ! is_array($data)) return Js::error(Lang::get('bk.info_incomplete'));
            
            //表单验证
            $validator = new UserValidator();
            if( ! $validator->password($data)) return Js::error($validator->getMsg());
            
            //判断旧密码的正确性
            if( ! Auth::validate(array('name' => $username, 'password' => $data['password_old'])))
                return Js::error(Lang::get('bk.wrong_old_password'));
                
            //生成新的密码
            if( ! empty($data['password']))
                $data['password'] = Hash::make($data['password']);
            else
                unset($data['password']);
            
            //不需要更新的数据
            unset($data['password_old'], $data['password_confirmation']);
            
            //开始入库
            if($this->userModel->editUser($data, Auth::user()->id) !== false)
            {
                return Js::error(Lang::get('bk.action_success'));
            }
        }
        return View::make('admin/user/password')->with(compact('username'));
    }

}